<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>脚本与安全 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'modules-scripting-security.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-scripting-security.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-scripting-security.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/modules-scripting-security.html" rel="nofollow" target="_blank">../en/modules-scripting-security.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="modules-scripting.html">脚本</a></span>
»
<span class="breadcrumb-node">脚本与安全</span>
</div>
<div class="navheader">
<span class="prev">
<a href="modules-scripting-fields.html">« 访问文档字段和特殊变量</a>
</span>
<span class="next">
<a href="modules-scripting-painless.html">painless脚本语言 »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="modules-scripting-security"></a>脚本与安全
</h2>
</div></div></div>
<p>
虽然Elasticsearch的贡献者尽一切努力防止脚本失控，但安全是最好在<a href="https://en.wikipedia.org/wiki/Defense_in_depth_(computing)" class="ulink" target="_top">layers</a>中完成的事情，因为所有软件都有漏洞，最大限度地降低任何安全层中的失败风险是很重要的。

下面是一些避免Elasticsearch成为漏洞的经验法则。
</p>
<h3>
<a id="_do_not_run_as_root"></a>不要以root身份运行
</h3>
<p>
首先，也最重要的是，永远不要以<code class="literal">root</code>用户的身份运行Elasticsearch，因为这将允许<span class="strong strong"><strong>任何</strong></span>成功绕过其他安全层的尝试在服务器上执行任何操作。

如果Elasticsearch检测到它以<code class="literal">root</code>用户身份运行，就会拒绝启动，但这非常重要，值得再三检查。
</p>
<h3>
<a id="_do_not_expose_elasticsearch_directly_to_users"></a>不要直接向用户公开Elasticsearch
</h3>
<p>
不要直接向用户公开Elasticsearch，而是让一个应用程序代表用户发出请求。

如果这是不可能的，请使用一个应用程序来净化来自用户的请求。

如果<span class="strong strong"><strong>这</strong></span>是不可能的，那么就需要一些机制来跟踪哪些用户做了什么。

要明白，编写一个<a class="xref" href="search.html" title="Search APIs"><code class="literal">_search</code></a>来压垮Elasticsearch并关闭集群是很有可能的。

所有这样的搜索都应该被认为是缺陷，Elasticsearch的贡献者努力阻止这种情况，但它们仍然是可能的。
</p>
<h3>
<a id="_do_not_expose_elasticsearch_directly_to_the_internet"></a>不要将Elasticsearch直接暴露在互联网上
</h3>
<p>
不要将Elasticsearch暴露给互联网，而是让一个应用程序代表互联网发出请求。

不要考虑让应用程序“净化”对Elasticsearch的请求。

要知道，一个非常有决心的恶意用户可能会编写搜索，使Elasticsearch集群不堪重负，并使其崩溃。 

例如：
</p>
<p>好的做法：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
用户在搜索框中键入文本，文本将被直接发送到<a class="xref" href="query-dsl-match-query.html" title="匹配查询" rel="nofollow">匹配(match)</a>、<a class="xref" href="query-dsl-match-query-phrase.html" title="匹配短语查询" rel="nofollow">匹配短语(match phrase)</a>、<a class="xref" href="query-dsl-simple-query-string-query.html" title="Simple query string query" rel="nofollow">简单查询字符串</a>或任何<a class="xref" href="search-suggesters.html" title="suggesters" rel="nofollow">suggesters</a>。
</li>
<li class="listitem">
运行包含上述任何查询的脚本，该脚本是作为应用程序开发过程的一部分编写的。
</li>
<li class="listitem">
使用用户提供的<code class="literal">params</code>运行脚本。
</li>
<li class="listitem">
用户操作使文档具有固定的结构。
</li>
</ul>
</div>
<p>坏的做法：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
用户可以编写任意脚本、查询和<code class="literal">_search</code>请求。
</li>
<li class="listitem">
用户操作使文档具有用户定义的结构。
</li>
</ul>
</div>
<h3>
<a id="modules-scripting-other-layers"></a>其他安全层
</h3>
<p>
除了用户权限和脚本沙箱，Elasticsearch使用<a href="http://www.oracle.com/technetwork/java/seccodeguide-139067.html" class="ulink" target="_top">Java安全管理器</a>和本地安全工具作为额外的安全层。
</p>
<p>
作为启动序列的一部分，Elasticsearch启用了Java安全管理器，它限制了部分代码可以采取的动作。

painless 使用这个来限制生成的 painless 脚本可以采取的动作，防止它们能够做像写文件和监听套接字这样的事情。
</p>
<p>
Elasticsearch在Linux中使用<a href="https://en.wikipedia.org/wiki/Seccomp" class="ulink" target="_top">seccomp</a>、在macOS中使用<a href="https://www.chromium.org/developers/design-documents/sandbox/osx-sandboxing-design" class="ulink" target="_top">Seatbelt</a>、在Windows中使用<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms684147" class="ulink" target="_top">ActiveProcessLimit</a>来防止 Elasticsearch fork或执行其他进程。
</p>
<p>
下面将会描述脚本的安全设置，以及如何改变上述的默认设置。

当允许超过默认值时，你应该非常非常小心。

任何额外的权限都会削弱Elasticsearch部署的整体安全性。
</p>
<h3>
<a id="allowed-script-types-setting"></a>允许的脚本类型设置
</h3>
<p>
默认情况下允许执行所有脚本类型。

这可以使用设置<code class="literal">script.allowed_types</code>来修改。

只允许执行设置中指定的类型。

若要指定不允许任何类型，请将<code class="literal">script.allowed_types</code>设置为<code class="literal">none</code>。
</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">script.allowed_types: inline <a id="CO281-1"></a><i class="conum" data-value="1"></i></pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO281-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
这将只允许执行内联脚本，而不允许执行存储的脚本（及任何其他类型的脚本）。
</p>
</td>
</tr>
</table>
</div>
<h3>
<a id="allowed-script-contexts-setting"></a>允许的脚本上下文设置
</h3>
<p>
默认情况下，允许执行所有脚本上下文。

这可以使用设置<code class="literal">script.allowed_contexts</code>来修改。

只允许执行设置中指定的上下文。

要指定不允许任何上下文，请将<code class="literal">script.allowed_contexts</code>设置为<code class="literal">none</code>。
</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">script.allowed_contexts: score, update <a id="CO282-1"></a><i class="conum" data-value="1"></i></pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO282-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
这将只允许执行评分(score)和更新(update)脚本，而不允许执行聚合及插件脚本(以及任何其他上下文)。
</p>
</td>
</tr>
</table>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="modules-scripting-fields.html">« 访问文档字段和特殊变量</a>
</span>
<span class="next">
<a href="modules-scripting-painless.html">painless脚本语言 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>